package com.shujia.day05;

public class Demo05MoreFormat {
    public static void main(String[] args) {
        /*
           TODO 多态
               前提条件，当多个类或者接口之间存在有继承或实现关系时，此时对于每个类都可以有其他的表示方式
                 举例：
                    张三 <= 张三人
                    张三他爸爸的儿子 <= 张三人
                    张三他爷爷的孙子 <= 张三人
                 对于一个人 可以有多种表示形式
               什么需要有多态？？
                    ① 对于继承关系来说，父类所有的变量及方法 其子类可以被继承
                    ② 当父类在方法中被调用时，那么其子类也应该满足其要求
                    ③ 为了增加方法的灵活性，可以将子类的对象传给父类变量进行使用
               多态定义: 父类引用指向子类对象
              注意：
                 ① 对于子类中独有的方法，当有多态时，不能通过父类引用调用子类对象的独有方法
                 ② 在强制类型转换时，需要存在有继承关系，才能相互转换
                 ③ 强制类型转换，不能违反多态的体系  父类引用指向子类对象



         */
        Sn son1 = new Sn("李天荣", 18);
        Fa son2 = new Sn("李天荣", 18);   // 多态
        GrandFa son3 = new Sn("李天荣", 18); // 多态

        GrandFa grandFa = new GrandFa();
        useInfo(grandFa); //
        useInfo(son1);
//        son2.pl

        Sn changeType2Son = (Sn) son3;
        changeType2Son.playGame();

//        String son31 = (String) son3;

//        Sn sn1 = new GrandFa();  // 出错

        // 错误
//        Sn fa = (Sn) grandFa; // grandFa变量中实际上保存的是 GrandFa 对象地址  进行强制类型转换
//        fa.playGame();

        /*
            TODO 成员访问特点
                成员方法/成员变量:
                    编译看左边，运行看右边
                静态方法:
                    编译看左边，运行看左边

         */
        Sn sn1 = new Sn("彭飞", 18);
        System.out.println(sn1.name);

        GrandFa grandFa1 = new Sn("彭飞", 18);
        System.out.println(grandFa1.name);
        System.out.println(grandFa1.age);
//        System.out.println(grandFa1.skill);

        grandFa1.show();
        grandFa1.run(); //  爷爷走路步履蹒跚...

    }

    public static void useInfo(GrandFa grandFa) {
        System.out.println("获取到了一个对象，其姓名为:" + grandFa.name + "年龄为:" + grandFa.age);

    }
//    public static void useInfo(Sn grandFa){
//        System.out.println("获取到了一个对象，其姓名为:"+grandFa.name+"年龄为:"+grandFa.age);
//    }

}

/*
    TODO 在相同的包下，类只能被定义一次，除了内部类形式
 */
class GrandFa {
    String name;
    int age;

    public GrandFa() {
        this.name = "爷爷";
        this.age = 60;
        System.out.println("爷爷出现了...");
    }

    public void show() {
        System.out.println("爷爷:" + "我叫" + name + " 今年：" + age);
    }

    public static void run() {
        System.out.println("爷爷走路步履蹒跚...");
    }

}

//final class Father extends GrandFather {
class Fa extends GrandFa {
    public Fa(String name, int age) {
//        super.name = name;
        this.name = name;
        this.age = age;
        System.out.println("父亲出现了...");
    }
}

class Sn extends Fa {
    String name;
    String skill;

    public Sn(String name, int age) {
        super(name, age);
        this.name = name;
        this.age = age;
        System.out.println("儿子出现了...");
    }

    public void show() {
        System.out.println("孙子:我叫" + name + " 今年：" + age);
    }

    public void playGame() {
        System.out.println("孙子年轻，游戏玩的溜溜的...");
    }

    public static void run() {
        System.out.println("孙子走路蹦蹦跳跳");
    }
}